import pika
import pickle
import requests

"""
对于消费者来说，可以设置一个循环，一直不断地从队列中取出这些请求对象，取出一个就执行一次爬取
这里消费者调用 basic_get 方法获取了消息，然后通过 pickle 反序列化还原成一个请求对象，然后使用 session 的 send 方法执行了该请求，进行了数据爬取，爬取成功就打印爬取成功的消息。

"""

MAX_PRIORITY = 100
QUEUE_NAME = 'scrape_queue'

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
session = requests.Session()

# 定义的回调方法
def scrape(request):
    try:
        # 对一个 requests.Request 对象，先用 .prepare() 方法转成可直接发出的“预处理请求”，再用 requests.Session.send() 方法实际发送 HTTP 请求，得到服务器响应对象（response）。
        response = session.send(request.prepare())
        print(f'success scraped {response.url}')
    except requests.RequestException:
        print(f'error occurred when scraping {request.url}')

while True:
    method_frame, header, body = channel.basic_get(
        queue=QUEUE_NAME, auto_ack=True)
    if body:
        request = pickle.loads(body)
        print(f'Get {request}')
        scrape(request)